/*
================================================================================
	Plik: f_brhs.c
--------------------------------------------------------------------------------
	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
	Projekt:Model mikrokontrolera AVR
	Kompilator: avr-gcc-4.3.5
	Doc: doxygen 1.7.4
--------------------------------------------------------------------------------
	Zawiera:
--------------------------------------------------------------------------------
	Komentarze:
================================================================================
*/

/*! \file f_brhs.c
 * \brief Plik opisujący funkcję BRHS
 */

#include "types.h"
#include "mem_abs.h"

/*TODO!!! opis BRHS do poprawienia
 *
 *
 *
 * Funkcja BRHS Branch if Half Carry flag is set. Branch czyli skok. Jeśli w wyniku poprzedniej
 * wykonanej operacji została ustawiona flaga H, to ma być skok do innego adresu. Czyli ma być
 * Zwiększone PC k o k. K zawiera się w przedziale (-64,+64). Nie testowałem czy działa do tyłu, ale
 * teoretycznie powinno.
 *
 * Przykład kodu assemblera, który testuje tę funkcję
 *
 * add r5,r6 ; r5 = 5,r6 = 9
 * branch przep
 * and r1,r2
 * and r2,r3
 * and r3,r4
 * ...
 * przep: nop
 * and r1,r2 <- test czy kolejna operacja się wykoan
 *
 */

void F_BRHS(void){

	#ifndef DEBUG_MODE
		printf("Function BRHS.");
	#endif
//Pobranie wartości stałej skoku z instrukcji
	int k_temp = (getMEMC(getPC()) & 0x0FFF);
	uint8_t k = (k_temp & 0b001111111000) >> 3;		//dziwna maska ale taka musi być, uwaga na win nie działa

// Sprawdzenie warunku ustawienia flagi C
// jeśli warunek jest spełniony to skok o k
// jeśli nie to skok o 1

	if( GetFlagRegisterStatus(FLAG_H) == 1 ) incPC_k(k);
	else incPC();

}
